// const fs = require('fs')

// // 定义“承诺”
// const p = new Promise((resolve, reject) => {
//   fs.readFile('./a.txt', 'utf-8', (err, data) => {
//     if (err) {
//       reject(err)
//     } else {
//       resolve(data.length)
//     }
//   })
// })
// console.log(p) // Promise { <pending> }

// // 获取“承诺”的结果
// p.then(
//   (data) => {
//     console.log(data)
//   },
//   (err) => {
//     console.log(err)
//   }
// )

// -------------------------- 2
// new Promise是同步执行的
// 获取结果时（调用 resolve 触发 then方法时）是异步的

// console.log(1)

// new Promise((resolve, reject) => {
//   console.log(2)
//   resolve()
//   console.log(3)
// }).then(res => {
//   console.log(4)
// })

// console.log(5)
// 输出顺序： 1  2  3  5  4 ,因为只有 .then() 是异步的

// ----------------------- 3
// then方法的链式调用
// - 前一个then里面返回的字符串，会被下一个then方法接收到。但是没有意义；
// - 前一个then里面返回的Promise对象，并且调用resolve的时候传递了数据，数据会被下一个then接收到
// - 前一个then里面如果没有调用resolve，则后续的then不会接收到任何值
// const fs = require('fs')
// // promise 承诺

// const p1 = new Promise((resolve, reject) => {
//   fs.readFile('./a.txt', 'utf-8', (err, data) => {
//     err ? reject(err) : resolve(data.length)
//   })
// })

// const p2 = new Promise((resolve, reject) => {
//   fs.readFile('./b.txt', 'utf-8', (err, data) => {
//     err ? reject(err) : resolve(data.length)
//   })
// })

// const p3 = new Promise((resolve, reject) => {
//   fs.readFile('./c.txt', 'utf-8', (err, data) => {
//     err ? reject(err) : resolve(data.length)
//   })
// })

// p1.then(a => {
//   console.log(a)
//   return p2
// }).then(b => {
//   console.log(b)
//   return p3
// }).then(c => {
//   console.log(c)
// }).catch((err) => { // catch 方法可以统一获取错误信息
//   console.log(err)
// })

// ---------------- 4
// 封装按顺序异步读取文件的函数
// function myReadFile(path) {
//   return new Promise((resolve, reject) => {
//     fs.readFile(path, 'utf-8', (err, data) => {
//       err ? reject(err) : resolve(data.length)
//     })
//   })
// }

// myReadFile('./a.txt')
//   .then(a => {
//     console.log(a)
//     return myReadFile('./b.txt')
//   })
//   .then(b => {
//     console.log(b)
//     return myReadFile('./c.txt')
//   })
//   .then(c => {
//     console.log(c)
//   })
//   .catch((err) => {
//     console.log(err)
//   })

const PromiseA = new Promise((resolve, reject) => {
  // 异步代码
  setTimeout(() => {
    // 异步结果返回出去:
    // 成功:
    // resolve('ajax成功而来') // resove()  => 当前Promise对象的then()里函数体执行
    // 失败:
    reject(new Error('报错了')) // reject() => 当前Promise对象的catch()里函数体执行
  }, 2000)
})
const PromiseB = PromiseA.then(res => {
  return [null, res]
}).catch(err => {
  return [err, null]
})
PromiseB.then(resB => {
  console.log(resB)
})

